package com.qf.qflivehou.service.serviceImpl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.qflivehou.config.RedisKey;
import com.qf.qflivehou.mapper.QfCourseDao;
import com.qf.qflivehou.mapper.repository.CourseRepository;
import com.qf.qflivehou.pojo.respVo.CourseTeachResp;
import com.qf.qflivehou.pojo.respVo.ResponseData;
import com.qf.qflivehou.pojo.vo.QfCourse;
import com.qf.qflivehou.service.QfCourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * (QfCourse)表服务实现类
 *
 * @author makejava
 * @since 2022-01-10 21:55:55
 */
@Service
public class QfCourseServiceImpl implements QfCourseService {
    @Resource
    private QfCourseDao qfCourseDao;

    @Autowired
    private CourseRepository courseRepository;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public QfCourse queryById(Integer id) {
        return this.qfCourseDao.queryById(id);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit 查询条数
     * @return 对象列表
     */
    @Override
    public List<QfCourse> queryAllByLimit(int offset, int limit) {
        return this.qfCourseDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param qfCourse 实例对象
     * @return 实例对象
     */
    @Override
    public QfCourse insert(QfCourse qfCourse) {
        this.qfCourseDao.insert(qfCourse);
        return qfCourse;
    }

    /**
     * 修改数据
     *
     * @param qfCourse 实例对象
     * @return 实例对象
     */
    @Override
    public QfCourse update(QfCourse qfCourse) {
        this.qfCourseDao.update(qfCourse);
        return this.queryById(qfCourse.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.qfCourseDao.deleteById(id) > 0;
    }

    @Override
    public ResponseData findCourseByClassify(Integer id,Integer page,Integer size) {
        //1.判断redis种是否有该key值
        Boolean aBoolean = redisTemplate.hasKey(RedisKey.COURSE_KEY + id.toString());
        //2.如果返回值为true,代表有该key值
        if(aBoolean){
            //有该key值,直接从redis中获取
            int index = (page-1)*size;
            List courses = redisTemplate.opsForList().range(RedisKey.COURSE_KEY + id.toString(), index, index + size - 1);
            Long size1 = redisTemplate.opsForList().size(RedisKey.COURSE_KEY + id.toString());
            return new ResponseData(0,"查询成功",courses,size1);
        }else {
            //代表redis中没有该key，则需要从数据库先来进行查询,将结果集放置在Redis中
            List<QfCourse> coueses = qfCourseDao.findCourseByClassify(id);
            if (coueses!=null && coueses.size()>0){
                //将查询出的结果集放置在redis中
                redisTemplate.opsForList().leftPushAll(RedisKey.COURSE_KEY + id.toString(),coueses);
                //从redis中获取
                int index = (page-1)*size;
                List courses = redisTemplate.opsForList().range(RedisKey.COURSE_KEY + id.toString(), index, index + size - 1);
                Long size1 = redisTemplate.opsForList().size(RedisKey.COURSE_KEY + id.toString());
                return new ResponseData(0,"查询成功",courses,size1);
            }else {
                return new ResponseData(0,"查询成功",null,null);
            }
        }
    }

    @Override
    public ResponseData findCourseDetailById(Integer id) {
        CourseTeachResp courseTeachResps = qfCourseDao.findCourseDetailById(id);
        if(courseTeachResps!=null){
            return new ResponseData(0,"查询成功",courseTeachResps,null);
        }
        return new ResponseData().fail();
    }
}